package com.Generics.bean.ch06;
import javax.lang.model.element.Element;
import java.util.*;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

/**
 * @author nmm
 * @date 2024-04-2024/4/1
 * @deriction njm......
 */
public class MyArrayList <E>{
    private  static  final  int DEFAULT_CAPACITY=10;//默认初始容量
    private  Object[] elements;//储存元素数组(E[] :泛型数组无法直接进行new 操作 )
    private  int size;//元素个数(等同于length)


    //无参构造(用于初始化信息)
    public MyArrayList() {
        this.elements = new Object[DEFAULT_CAPACITY];//初始化将数组长度设置为默认长度
        this.size = 0;
    }

    /***
     * @desc:用于检查当前容量
     * @param minCapacity:给定要检查的容量
     */
    public void ensureCapacity(int minCapacity) {
    int oldCapacity=elements.length;//获取当前数组元素长度 10(初始化为10)

    if (minCapacity>oldCapacity){//如果要检查的容量大于当前容量
    Object []newElements=new Object[oldCapacity*2]; //创建一个新的数组(比当前数组容量多2倍)
    System.arraycopy(elements,0,newElements,0,size);//将之前数组里的元素拷贝到新的数组中
    elements=newElements;//用新的数组替换之前的数组
        System.out.println("容量不足,扩容后容量为"+elements.length);
    }
        System.out.println("容量足够,当前容量为"+elements.length);
    }


    /**
     *
     * @param element:要添加的元素
     */
    public boolean add(E element) {
        ensureCapacity(size+1);//确保当前容量充足
        elements[size]=element;//将元素添加到数组中
        size++;//长度加1
        return true;
    }


    /***
     *
     * @param index:要移除元素的下标
     * @return 返回要移除的元素
     */
    public E remove(int index) {
    if (index<0||index>=size){
            throw new IndexOutOfBoundsException(String.format("下标越界,当前要删除元素下标:%d,数组总长度为%d",index,size));
    }

    E element= (E) elements[index];//保存元素用于返回
    for (int i = index; i < size-1; i++) {
        elements[i]=elements[i+1];//从当前下标(从0)开始遍历,将后面元素的值赋给前一个元素(相当于copy了一份给前一个元素)▲但此时后一个元素还是不变的
    }
    elements[size-1]=null;//(所以要)将下标最后一个元素设置为空
    size--;//总长度减一
    return  element;//返回删除元素
    }


    /***
     *
     * @param index:要获取元素的下标
     * @return 要获取的元素
     */
    public E get(int index) {
        if (index<0||index>=size){
            throw new IndexOutOfBoundsException(String.format("下标越界,当前要删除元素下标:%d,数组总长度为%d",index,size));
        }

        return (E) elements[index];//返回泛型类类型  return (E) elements[index]== return (object) elements[index];
        //因为时泛型数组,所以返回值和元素都是不确的(同理用object也是可以的)
    }


    /***
     *
     * @param index:元素下标
     * @param element:要替换的值(元素)
     * @return
     */
    public E  set(int index,E element) {
        if (index<0||index>=size){
            throw new IndexOutOfBoundsException(String.format("下标越界,当前要删除元素下标:%d,数组总长度为%d",index,size));
        }
        E  oldVal= (E)elements[index];//获取当前要替换的元素
        elements[index]=element;//设置指定下标的元素为指定的值
        return oldVal;
    }


    /**
     *
     * @return:返回数组长度
     */
     public int  size() {
      return size;
     }


    /***
     *
     * @return 数组长度是否为null(true||false )
     */
     public boolean isEmpty(){
       return size==0;
     }

}